package com.rem.designPattern.designPrinciple.demeter;

import java.util.ArrayList;
import java.util.List;

/**
 * 设计模式七大原则--迪米特原则
 * 最少知道原则，即一个类对自己依赖的类知道的越少越好 只与直接朋友通信
 * 只要两个对象之间有耦合关系（依赖，关联，组合，聚合等），我们就说这两个对象之间是朋友关系
 * 直接的朋友：出现成员变量，方法参数，方法返回值中的类
 * 非直接朋友关系：出现在局部变量中类
 * <p>
 * 需求：实现打印一个学校 总部和多个学院的员工ID
 * <p>
 * 反例：在总部员工类打印学院的员工 不是总部类的直接朋友
 *
 * @author Rem
 * @date 2022-11-12
 */
public class Demeter01 {
    public static void main(String[] args) {
        SchoolManager schoolManager = new SchoolManager();
        schoolManager.printAllEmployee(new College());
    }
}

/**
 * 总部员工类
 */
class ManagerEmployee {
    private String id;

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return this.id;
    }
}

/**
 * 总部类
 */
class SchoolManager {
    public List<ManagerEmployee> getAllEmployee() {
        List<ManagerEmployee> list = new ArrayList<>();
        for (int i = 0; i < 5; ++i) {
            ManagerEmployee emp = new ManagerEmployee();
            emp.setId("学校总部员工id= " + i);
            list.add(emp);
        }
        return list;
    }

    /**
     * 打印所有员工ID
     *
     * @param college
     */
    public void printAllEmployee(College college) {
        /**
         * 打印总部员工ID
         */
        System.out.println("------------学校总部员工------------");
        List<ManagerEmployee> managerList = this.getAllEmployee();
        managerList.forEach(i -> System.out.println(i.getId()));

        /**
         * 打印学院员工ID
         */
        System.out.println("------------学院员工------------");
        List<CollegeEmployee> collegeList = college.getAllEmployee();
        collegeList.forEach(i -> System.out.println(i.getId()));
    }
}

/**
 * 学院员工类
 */
class CollegeEmployee {
    private String id;

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return this.id;
    }
}

/**
 * 学院类
 */
class College {
    public List<CollegeEmployee> getAllEmployee() {
        List<CollegeEmployee> list = new ArrayList<>();
        for (int i = 0; i < 10; ++i) {
            CollegeEmployee emp = new CollegeEmployee();
            emp.setId("学院员工id= " + i);
            list.add(emp);
        }
        return list;
    }
}